【第1846期】Node.js 在 2020 年有什么新东西
前言
了解2020 年 Node.js 的发布计划。今日早读文章由@Node地下铁分享。
正文从这开始~~
2019 年,Node.js 已经10岁了,而 NPM 上可用的包数量也超过了 100 万个。Node.js 本身的下载数也仍在上升,同比上年增长 40%。另一个重要的里程碑是 Node.js 最近加入了 OpenJS 基金会,该基金会承诺改善项目的健康度和可持续性,并加强与整个 JavaScript 社区的协作。
如你所见,在短时间内发生了很多事情!Node.js 社区每年都有增长势头,2020 年没有丝毫放缓的迹象。在 Node.js 的下一个主要版本中,正在研究许多有趣的特性。在本文中,将会探讨 Node.js 社区在 2020 年值得期待的一些重要更新。
Node.js 13 有什么新功能?
在本文成文时最新版本是 Node.js 13,有很多功能和更新可以在 2020 年之前开始使用,下面是一些亮点:
ECMAScript 模块
WebAssembly 支持
诊断报告
对日期、时间、数字和货币格式提供全面的国际化支持
QUIC 协议支持
V8 JavaScript 引擎性能更新
在详细了解这些更新之前,让我们先看看 Node.js 的发布计划。
2020 年 Node.js 的发布计划
每 6 个月发布一个新的 Major 版本,分别在 10 月和 4 月。此主要版本称为当前版本。截至本文撰写之时,Node.js 的当前版本为 13,于 2019 年 10 月发布。
奇数版本(如v9、v11、v13)每年 10 月发布,时间很短不被视为已准备好投入生产。可以认为奇数版本是测试版,为了测试新特性和引入 Node.js 下一个偶数版本的变更。
偶数版本(如v8、v10、v12)每年 4 月发布。发布后,以前的奇数版本将停止接收更新。虽然比奇数版本更稳定,但在未来 6 个月内仍将积极开发更新,可以把前 6 个月看作是一个发布候选期。
一旦一个偶数版本经过 6 个月,就进入了一个新的生命阶段,称为长期支持(LTS)。LTS 阶段可以被视为可以被应用于生产环境,在接下来的 12 个月中,LTS 版本以不破坏任何现有应用的目的进行 bug 修复、安全更新和其他改进。
在 LTS 之后,有一个最后的维护阶段。维护阶段为 18 个月,在此阶段中只会进行严重的错误和安全修复。经过 18 个月的维护,将被视为寿命结束(EOL),不再进行支持。
预计 2020 年的发布时间表
预计在 2020 年会以下面的时间表发布:
2020年1-3月
13.x 是当前版本,并积极开发
10.x 和 12.x 为 LTS
2020年4月
14.x 发布并成为当前版本
14.x 发布后,13.x 工作立即停止
10.x 进入维护阶段
2020年10月
15.x 发布并成为当前版本
14.x 进入LTS
12.x 进入维护
注:由于 8.x 的生命周期结束(EOL)依赖于 OpenSSL-1.0.2,因此计划在 2019 年底结束,OpenSSL-1.0.2 也计划在 2019 年底结束。如果你还没有准备好,请计划起来将 8.x 应用程序升级到 10.x 或 12.x。
支持 ECMAScript 模块
从 v13.2.0 开始,Node.js 将支持传统的 CommonJS 模块和新的 ECMAScript(ES) 标准模块。这意味着将可以使用 import 和 export 语法,您可能已经在浏览器中尝试过了。另外,需要注意的是 Node.js 中的 ES 模块在默认情况下启用了 JavaScript Strict 模式,因此不需要在每个文件的顶部指定 "use strict"。
// message file
asyncfunction sendMessage { ... }
export{ sendMessage };
// index file
import{ sendMessage } from"./message";
但是,仍然需要额外做一些事情,让 Node.js 知道您正在使用 ES 模块。最常用的两种方法是使用 .mjs 文件扩展名或在最近的 package.json 中指定"type": "module"。
选项一:重命名 .js 文件为 .mjs 文件;
选项二:更新项目根 package.json,或者增加一个 package.json 到包含 ES 模块的目录来指定 type 和module;
{
"type": "module"
}
还有一种方法,在根 package.json 文件中启用 ES 模块,然后重命名所有 CommonJS 文件为 .cjs 扩展名。
Node.js 可以导入 WebAssembly 模块
除了支持 ES 模块外,还可以导入 WebAssembly(Wasm)模块!WebAssembly 模块是一种可移植的二进制格式,可以比 JavaScript 更快地解析并以本机速度执行。WebAssembly 模块可以使用诸如 C/C++、Go、C#、Java、Python、Elixir、Rust 等语言来建构。
截至本文撰写时,WebAssembly 模块支持仍处于试验阶段。要启用此功能,必须在执行 Node.js 时传递命令行参数。例如:
node --experimental-wasm-modules index.js
下面是一个例子,假设有一个图像处理库为 WebAssembly 模块实现。使用这个 WebAssembly 模块的语法可能如下所示。
import* as imageUtils from"./imageUtils.wasm";
import* as fs from"fs";
( async() => {
const image = await fs.promises.readFile( "./image.png");
const updatedImage = await imageUtils.rotate90degrees( image );
} )();
还可以使用 Node.js 中新的动态 import() 语句导入 WebAssembly 模块。
"use strict";
const fs = require("fs");
( async() => {
const imageUtils = awaitimport( "./imageUtils.wasm");
const image = await fs.promises.readFile( "./image.png");
const updatedImage = await imageUtils.rotate90degrees( image );
} )();
WebAssembly系统接口(WASI)
与 JavaScript 类似,WebAssembly 在设计时亦考虑了安全性,以防止访问不被预期的底层操作系统。但是,在您可控的情况下有些时会受益于 WebAssembly 的能力,来进行一些系统级别的调用。
这就是新的 WebAssembly 系统接口(WASI),WASI 被设计成一个标准接口,用于调用底层系统,如主机应用程序、本机操作系统等。
最初的 WASI 支持最近被提交到 Node.js 项目。WASI 是 2020 年 Node.js 另一个激动人心的特性!
2020 将推出诊断报告
诊断报告是人类可读的 JSON 格式的进程信息摘要,包括调用堆栈、操作系统信息、加载的模块和其它可以帮助应用程序的有用数据。这些报告可以在未处理的异常、致命错误、进程信号或使用新的 process.report API 时触发。Node.js 可以配置将诊断报告保存到指定的文件夹和文件名。
截至本文撰写之时,诊断报告仍在实验阶段。要启用此功能,必须在执行 Node.js 时传递命令行参数。例如:
node --experimental-report --report-uncaught-exception --report-filename=./diagnostics.json index.js
2020 国际化支持将加大
从 v13.x 开始,Node.js 使用完整的 ICU(International Components for Unicode),ICU 是一个成熟而流行的全球化库。ICU 包括对格式化数字、日期、时间和货币、执行时间计算和字符串比较,以及在 Unicode 和其他字符集之间转换文本的支持。
2020 的其他 Node.js 更新
QUIC 协议支持:提供更高性能和可靠性的现代传输协议;
更好的 Python 3 构建支持:到 2020 年,应该可以使用 Python3 构建 Node.js 和本机模块;
更新的 V8 JavaScript 引擎:V8 v7.8 和 7.9 提高了性能和 Wasm 支持;
稳定的 Worker Threads API:Node.js 中的 Worker Threads 支持并行与 CPU 密集型的 JavaScript 操作;
进一步了解 Node.js、JavaScript 和 安全性
这篇文章只是在 2020 年为改进 Node.js 所做的所有努力中的一个开始!如果您有兴趣随时了解最新的更改或以某种方式参与其中,Node.js 网站上有一个对 Node.js 做出贡献的方法列表。
关于本文 译文:https://mp.weixin.qq.com/s/RGTjSaY_knfXMAgecPV5Ag 作者:@David Neal 原文:https://developer.okta.com/blog/2019/12/04/whats-new-nodejs-2020
为你推荐
【第1835期】llhttp是如何使Node.js性能翻倍的?